import axios from 'axios';
import { baseURL } from './config.js';
import { handleApiError, handleNetworkError } from '@/utils/errorHandler.js';

// 定义具体的 API 请求地址
const API_ENDPOINTS = {
  // 1.用户登录相关接口
  LOGIN: `${baseURL}/function/pageData/userLogin`,

  //2.查询图片分类接口
  SEND_CATEGORIES: `${baseURL}/function/pageData/sendCategories`,

  //3.上传图片接口
  UPLOAD_IMAGE: `${baseURL}/function/pageData/upload`,

  //4.获取已上传图片数量接口
  GET_UPLOAD_IMAGES_COUNT: `${baseURL}/function/pageData/uploadImagesCount`,

  //分页查询图片文件接口
  GET_IMAGE_PAGE: `${baseURL}/function/pageData/getImagePage`,

  // 搜索图片接口
  SEARCH_IMAGE_PAGE: `${baseURL}/function/pageData/searchImagePage`,

  // 分类查询图片接口
  WALLPAPER_CATEGORIES_PAGE: `${baseURL}/function/pageData/wallpaperCategoriesPage`,

  // 获取精选壁纸接口
  GET_SELECTED_WALLPAPERS: `${baseURL}/function/pageData/getSelectedWallpapers`,

  // 根据ID查询图片详情接口
  GET_IMAGE_BY_ID: `${baseURL}/function/pageData/getImageWallpaperById`
};

// 创建 Axios 实例
const apiClient = axios.create({
  baseURL,
  timeout: 10000, // 增加超时时间到10秒
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
apiClient.interceptors.request.use(
  (config) => {
    // 添加请求时间戳
    config.metadata = { startTime: new Date() }
    return config
  },
  (error) => {
    handleNetworkError(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
apiClient.interceptors.response.use(
  (response) => {
    // 计算请求耗时
    const endTime = new Date()
    const startTime = response.config.metadata?.startTime
    const duration = startTime ? endTime - startTime : 0
    

    
    return response
  },
  (error) => {
    // 计算请求耗时
    const endTime = new Date()
    const startTime = error.config?.metadata?.startTime
    const duration = startTime ? endTime - startTime : 0
    

    
    // 根据错误类型处理
    if (error.code === 'ECONNABORTED') {
      handleNetworkError(error)
    } else if (error.response) {
      handleApiError(error, error.config?.url)
    } else {
      handleNetworkError(error)
    }
    
    return Promise.reject(error)
  }
)

// 新增上传图片接口
const uploadImage = async (file, categories, heat, classify = '') => {
  const formData = new FormData();
  formData.append('file', file); // 后端接收参数名为 "file"
  
  // 将分类ID数组转换为后端需要的格式
  categories.forEach(categoryId => {
    formData.append('categories', categoryId);
  });
  
  formData.append('heat', heat); // 热度参数
  formData.append('classify', classify); // 二级分类参数

  // 不设置 Content-Type，axios 会自动设置为 multipart/form-data
  const response = await apiClient.post(API_ENDPOINTS.UPLOAD_IMAGE, formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
    }
  });
  return response.data; // 返回 Result<String> 中的 data 字段
};


//获取已上传图片数量
const getUploadImagesCount = async () => {
  const response = await apiClient.get(API_ENDPOINTS.GET_UPLOAD_IMAGES_COUNT);
  return response.data; // 返回的是 { code, msg, data } 结构
};


/**
 * 用户登录接口
 * @param {Object} params 请求参数
 * @param {string} params.name 用户名
 * @param {string} params.passWord 密码
 * @returns {Promise<any>} 返回后端返回的 data 字段
 */
const userLogin = async (params) => {
  const { name, passWord } = params;

  if (!name || !passWord) {
    throw new Error('用户名和密码不能为空');
  }

  try {
    const response = await apiClient.post(API_ENDPOINTS.LOGIN, {
      name,
      passWord
    });


    return response.data; // 返回如 { code: 200, msg: '操作成功', data: null }
  } catch (error) {
    console.error('=== API 请求错误 ===');
    console.error('错误详情:', error);
    console.error('错误状态:', error.response?.status);
    console.error('错误数据:', error.response?.data);
    console.error('错误配置:', error.config);
    throw error;
  }
};

//查询图片分类名称接口
const sendCategories = async () => {
  const response = await apiClient.get(API_ENDPOINTS.SEND_CATEGORIES);
  return response.data;
}

/**
 * 搜索图片接口
 * @param {Object} params 请求参数
 * @param {number} [params.page=1] 当前页码
 * @param {number} [params.pageSize=21] 每页数量
 * @param {string} [params.name=''] 搜索名称
 * @returns {Promise<any>} 返回后端返回的 data 字段
 */
const searchImagePage = async (params = {}) => {
  const { 
    page = 1, 
    pageSize = 21, 
    name = '' 
  } = params;

  try {
    const response = await apiClient.post(API_ENDPOINTS.SEARCH_IMAGE_PAGE, {
      page,
      pageSize,
      name
    });

    return response.data;
  } catch (error) {
    console.error('搜索图片失败:', error);
    throw error;
  }
};

/**
 * 分类查询图片接口
 * @param {Object} params 请求参数
 * @param {number} [params.page=1] 当前页码
 * @param {number} [params.pageSize=12] 每页数量
 * @param {number} [params.type=1] 类型：1-静态壁纸，2-动态壁纸
 * @param {number} [params.heat=1] 热度：1-最热，2-最新
 * @param {number} [params.categories] 分类ID
 * @returns {Promise<any>} 返回后端返回的 data 字段
 */
const wallpaperCategoriesPage = async (params = {}) => {
  const { 
    page = 1, 
    pageSize = 12,
    type = 1,
    heat = 1,
    categories
  } = params;

  try {
    const requestData = {
      page,
      pageSize,
      type,
      heat
    };

    // 只有当分类ID存在时才添加到请求参数中
    if (categories) {
      requestData.categories = categories;
    }

    const response = await apiClient.post(API_ENDPOINTS.WALLPAPER_CATEGORIES_PAGE, requestData);

    return response.data;
  } catch (error) {
    console.error('分类查询图片失败:', error);
    throw error;
  }
};

/**
 * 获取精选壁纸接口
 * @returns {Promise<any>} 返回后端返回的 data 字段
 */
const getSelectedWallpapers = async () => {
  try {
    const response = await apiClient.get(API_ENDPOINTS.GET_SELECTED_WALLPAPERS);
    return response.data;
  } catch (error) {
    console.error('获取精选壁纸失败:', error);
    throw error;
  }
};

/**
 * 根据ID查询图片详情接口
 * @param {number} id 图片ID
 * @returns {Promise<any>} 返回后端返回的 data 字段
 */
const getImageById = async (id) => {
  try {
    const response = await apiClient.get(`${API_ENDPOINTS.GET_IMAGE_BY_ID}/${id}`);
    return response.data;
  } catch (error) {
    console.error('根据ID查询图片详情失败:', error);
    throw error;
  }
};

// 导出内容
export default apiClient;
export { uploadImage, getUploadImagesCount, userLogin, sendCategories, searchImagePage, wallpaperCategoriesPage, getSelectedWallpapers, getImageById };
export const apiEndpoints = API_ENDPOINTS;
